/**
 * 
 */
package me.zzp.ar.d;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;

import me.zzp.ar.ex.DBOpenException;
import me.zzp.ar.ex.UnsupportedDatabaseException;
import me.zzp.ar.sql.MsSqlBuilder;
import me.zzp.ar.sql.SqlBuilder;

/**
 * Ms SQL server 方言。
 * 
 * @author Tom
 */
public class MsSQLDialect implements Dialect {

	/**
	 * 判断当前数据库的名称里是否包含microsoft（忽略大小写）。
	 * 
	 * @param c 数据库连接
	 * @return 如果数据库名称包含microsoft，则返回true；否则返回false。
	 */
	@Override
	public boolean accept(Connection c) {
	    try {
	        DatabaseMetaData d = c.getMetaData();
	        String name = d.getDatabaseProductName(); // Microsoft SQL Server
	        int version = d.getDatabaseMajorVersion();
	        if (name.toLowerCase().contains("microsoft")) {
	            if (version >= 11) {
	              return true; // since 2012
	            } else {
	              throw new UnsupportedDatabaseException(String.format("%s %d: Microsoft SQL Server database need 2012+", name, version));
	            }
	        } else {
	            return false;
	        }
	    } catch (SQLException e) {
	        throw new DBOpenException(e);
	    }
	}

	/**
	 * 返回Ms SQL中定义自增长的整型主键语句。
	 * 
	 * @return int primary key NOT NULL IDENTITY (1, 1)。
	 */
	@Override
	public String getIdentity() {
		return "int primary key NOT NULL IDENTITY (1, 1)";
	}

	/**
	 * 原样返回标识。
	 * 
	 * @param identifier 待转换的标识。
	 * @return 标识本身。
	 */
	@Override
	public String getCaseIdentifier(String identifier) {
		return identifier;
	}

	/* (non-Javadoc)
	 * @see me.zzp.ar.d.Dialect#getSqlBuilder()
	 */
	@Override
	public SqlBuilder getSqlBuilder() {
		return new MsSqlBuilder();
	}

}
